% Tamaño de letra.
\documentclass[12pt,titlepage]{article}

%------------------------------ Paquetes ----------------------------------

% Paquetes:

%Para comentarios multilínea.
\usepackage{verbatim}

% Para tener cabecera y pie de página con un estilo personalizado.
\usepackage{fancyhdr}

% Codificación UTF-8
\usepackage[utf8]{inputenc}

% Castellano.
\usepackage[spanish]{babel}

% Tamaño de página y márgenes.
\usepackage[a4paper,headheight=16pt,scale={0.75,0.8},hoffset=0.5cm]{geometry}

% Para poder agregar notas al pie en tablas:
%\usepackage{threeparttable}

% Tipo de letra Helvetica (Arial).
%\usepackage{helvet}
%\renewcommand\familydefault{\sfdefault}

% Gráficos:

% Para incluir imágenes, el siguiente código carga el paquete graphicx
% según se esté generando un archivo dvi o un pdf (con pdflatex).

% Para generar dv.
%\usepackage[dvips]{graphicx}

% Para generar pdf.
\usepackage[pdftex]{graphicx}
\pdfcompresslevel=9
\pdfminorversion=5
\usepackage{pdfpages}

%
% Directorio donde están las imagenes.
%
%\newcommand{\imgdir}{includes}
%\graphicspath{{\imgdir/}}

%------------------------------ ~paquetes ---------------------------------

%------------------------- Inicio del documento ---------------------------

\begin{document}

% ---------------------- Encabezado y pie de página -----------------------

% Encabezado: sección a la derecha.
% Pie de página: número de página a la derecha.

\pagestyle{fancy}
\renewcommand{\sectionmark}[1]{\markboth{}{\thesection\ \ #1}}
\lhead{}
\chead{}
\rhead{\rightmark}
\lfoot{}
\cfoot{}
\rfoot{\thepage}

% ---------------------- ~Encabezado y pie de página ----------------------

% -------------------------- Título y autor(es) ---------------------------

\title{ConcuShare}
\author{}

% -------------------------- ~Título y autor(es) --------------------------

% ------------------------------- Carátula --------------------------------

\begin{titlepage}

\thispagestyle{empty}

% Logo facultad más pie de la figura.
\begin{center}
\includegraphics[scale=0.55]{./Images/fiuba}\\
\large{\textsc{Universidad de Buenos Aires}}\\
\large{\textsc{Facultad De Ingeniería}}\\
\small{Año 2011 - 2\textsuperscript{do} Cuatrimestre}
\end{center}

\vfill

% Título central.
\begin{center}

\Large{\underline{\textsc{Técnicas de Programación Concurrente I (75.59)}}}

\vfill

% Tabla de integrantes.

\Large{\underline{\textsc{ConcuShare}}}

\vfill

\Large\underline{Integrantes} \linebreak\linebreak

% Separación entre columnas.
\large\addtolength{\tabcolsep}{-3pt}
% Tres columnas con alineación centrada.
\begin{tabular}{|| c | c | c ||}
\hline
\textbf{Apellido, Nombre} & \textbf{Nro. Padrón} & \textbf{E-mail} \\
\hline
Bukaczewski, Veronica & 86954 & vero13@gmail.com \\
\hline
Garbarini, Lucia & 88300 & lu.teddy@gmail.com \\
\hline
De Antoni, Matías & 88506 & mdeantoni87@gmail.com \\
\hline
\end{tabular}
\end{center}

\vfill

\hrule
\vspace{0.2cm}

% Pie de página de la carátula.
\noindent\small{75.59 - Técnicas de Programación Concurrente I \hfill}

\end{titlepage}

% ------------------------------- ~Carátula -------------------------------

% -------------------------------- Índice ---------------------------------

% Hago que las páginas se comiencen a contar a partir de aquí.
\setcounter{page}{1}

% Índice.
\tableofcontents
\newpage

% -------------------------------- ~Índice --------------------------------

% ----------------------------- Inicio del tp -----------------------------

\section{Objetivo}
El objetivo de este proyecto es el desarrollo de una aplicaci\'on conocida como {\textbf{ConcuShare}}. Esta
aplicaci\'on permitir\'a a los usuarios enviar y recibir archivos al mismo tiempo, tanto archivos de texto
como binarios. Cada usuario ejecutar\'a un programa que le permitir\'a publicar los archivos que desea
compartir con los dem\'as, as\'i como tambi\'en realizar el intercambio de archivos.

\pagebreak
\section{Análisis del problema}
Para el an\'alisis del problema, lo primero que se buscaron fueron los posibles actores que pod\'ia llegar
a tener el sistema. \\ \\
\textbf{Identificar actores:} 
  \begin{itemize}
    \item Usuario que comparte y descarga: Son los interesados en subir y bajar archivos de otros usuarios. Son los mas frecuentes que usar\'an la aplicaci\'on.
    \item Usuario que solo comparte: Son los interesados en compartir sus archivos a otros usuarios.
    \item Usuario que solo descarga: Son los interesados en descargar archivos a otros usuarios.
  \end{itemize}

\textbf{NOTA:} En la identificaci\'on de los actores se utiliz\'o la diferenciaci\'on entre usuarios que solo comparten y solo descargan, para mostrar los que cada usuario puede realizar cuando habilita o no archivos para poder ser descargados por otros usuarios.\\

Luego se identificaron los casos de uso. \\
\textbf{Identificar casos de uso:} Los casos de uso encontrados son los desprendidos de los tipos de perfiles
de usuario que se pudieron encontrar.
\begin{itemize}
 \item Compartir archivo: Permite a un usuario habilitar un archivo propio para poder ser descargado por otros
usuarios que se encuentren utilizando la aplicaci\'on.
 \item Descompartir archivo: Permite a un usuario deshabilitar un archivo propio para que otros usuarios no
lo descarguen.
 \item Conocer archivos compartidos: Permite a un usuario conocer todos los archivos compartidos por los distintos usuarios que se encuentran utilizando la aplicaci\'on.
 \item Conocer mis archivos compartidos: Permite conocer al usuario sus archivos que est\'an habilitados para poder ser descargados por otros usuarios.
 \item Descargar archivo: Permite al usuario descargar un archivo compartido de otro usuario, que pudo observar en \textit{conocer archivos compartidos}.
\end{itemize}

\subsection{Caso de uso: Descargar archivo}
Se considera el siguiente caso de uso, el m\'as importante dentro de la aplicaci\'on:
\begin{enumerate}
 \item \textbf{Nombre:} Descargar archivo
 \item \textbf{Descripción:} El objetivo de este caso uso es que el usuario descargue un archivo.
 \item \textbf{Actores:} Se necesitan dos actores, el primer actor es un usuario que comparta archivos y el segundo actor es un usuario que descargue archivos. 
 \item \textbf{Pre-condiciones:} Ambos usuarios deben estar conectados a la aplicaci\'on. Y adem\'as el usuario que comparte archivos debe haber habilitado un archivo para compartir.
 \item \textbf{Post-condiciones:} El usuario que descarga archivo, va a tener descargado una copia del archivo que el usuario que comparte permit\'ia descargar.
 \item \textbf{Flujo Principal:}
  \begin{enumerate}
   \item El usuario abre la aplicaci\'on.
   \item El usuario utiliza la opci\'on \textit{Conocer archivos compartidos}.
   \item El usuario selecciona un archivo de dicha lista y selecciona descargar.
   \item El usuario mientras espera que dicho archivo se descargue, puede descargar otros archivos y/o compartir/descompartir archivos propios o simplemente esperar a que la descarga se complete.
  \end{enumerate}

\end{enumerate}

\begin{figure}
 \centering
 \includegraphics[width=400pt,height=350pt]{./Images/casos_de_uso.png}
 % casos_de_uso.png: 548x459 pixel, 72dpi, 19.33x16.19 cm, bb=0 0 548 459
 \caption{Casos de uso}
\end{figure}

\pagebreak
\section{Tareas realizadas}
\begin{enumerate}
 \item Dividir el programa en procesos. El objetivo es lograr que cada programa participante este conformado por un conjunto
 de procesos que sean lo más sencillos posible. \\
  \textbf{Solución:} Los posibles procesos que un programa en ejecucción puede lanzar son:
    \begin{itemize}
     \item Se crean dos procesos principales: la consola y el server. La consola permite al usuario ingresar comandos mientras las dem\'as operaciones se realizan en background. El server permite gestionar los pedidos de descargas que provienen de otros usuarios, es decir, espera a que otros usuarios pidan de descargar un archivo y procede a enviarlo.
     \item Se crea un proceso cada vez que se quiere compartir un archivo, ya que es una operacion que accede a recursos compartidos por varios procesos, con lo cual puede haber cierta demora hasta que los recursos esten disponibles.
     \item Se crea un proceso, de la misma forma se procede al momento de dejar de compartir un archivo.
     \item Se crean dos proceso por cada archivo que se desea transferir. Del lado del usuario que solicita la descarga, se crea un proceso para descargar el archivo. Del lado del usuario que esta compartiendo el archivo, se crea un proceso para enviar el archivo. De esta forma se admite tener transferencias en simult\'aneo, tanto de subidas como de descargas.
    \end{itemize}
 
 \item Una vez obtenida la división en procesos, establecer un esquema de comunicación entre ellos teniendo en cuenta los
 requerimientos de la aplicación. ¿Qué procesos se comunican entre sí? ¿Qué datos necesitan compartir para poder trabajar? \\
  \textbf{Solución:} 
    \begin{itemize}
     \item El proceso de descarga y el de subida deben tener un canal de comunicaci\'on 1 a 1 a trav\'es del cual el que sube el archivo escribe los bytes a transferir y el que descarga lee esos bytes.
     \item Entre el server y los procesos que realizar solicitudes se necesita un canar 1 a muchos o bien 1 a 1 (asegurando que solo un proceso acceda a la vez), en donde el server lee bytes de cada request y el (o los) procesos que solicitan escriben su request.
     \item El servidor necesitara tener acceso a una variable compartida con la consola para saber cuando dejar de escuchar pedidos. La necesidad de salir puede llegar de manera asincrona.
     \item Todos los procesos deben acceder a una "base de datos" de usuarios y archivos compartidos, a traves de la cual publicar los archivos que comparten y conocer los compartidos por otros. Se propone el uso de 2 tipos de archivo: uno de usuarios conectados, compartido por todos los procesos, donde se registren los usuarios actualmente conectados; y un archivos donde se registren los archivos compartidos de cada usuario (hay uno de estos archivos por cada usuario conectado).
    \end{itemize}

 \item Tratar de mapear la comunicación entre los procesos a los problemas conocidos de concurrencia. \\
  \textbf{Solución:} 
    \begin{itemize}
     \item En las comunicaciones entre procesos de carga y descarga, y entre el de solicitudes de descarga y server el modelo es productor - consumidor.
     \item En las comunicaciones entre procesos para ver usuarios conectados y archivos compartidos el modelo es lector - escritor.
    \end{itemize}

 \item Determinar los mecanismos de concurrencia a utilizar para cada una de las comunicaciones entre procesos que fueron 
  detectados en el ítem 2. No se requiere la utilización de algún mecanismo espec\'ifico, la elección en cada caso queda
   a cargo del grupo y debe estar debidamente justicada. \\
  \textbf{Solución:} 
    \begin{itemize}
     \item Entre los procesos de descarga y subida la comunicacion es mediante un fifo, a traves del cual se transmiten los bytes del archivo. Ambos procesos conocen el nombre del fifo de transferencia, que se deduce del archivo a descargar y de los ids de usuarios que intervienen en la transferencia
     \item Entre los procesos de descarga que realizan solicitudes y el server que escucha estos pedidos, se comparte un fifo con el nombre del id del server ( hay un unico fifo de pedidos por cada server) a traves del cual se evian/reciben los pedidos y 2 semaforos para su sincronizacion ( para asegurar que solo 1 proceso a la vez escriba en el fifo y que haya un solo escritor y un solo lector a la vez)
     \item La consola / modelo comunica al server que debe cerrarse mediante una señal SIGTERM ( SIGINT tambien es aceptada), la cual modifica una variable atomica. Esta variable es checkeada por el server luego de cada request  para saber si debe seguir escuchando pedidos o si debe terminar y liberar recursos
     \item Todos los procesos que realizan operaciones con archivos compartidos se comunican mediante Lock Files. Ej: para registrarse como usuario conectado, desconectarse y ver usuarios conectados, los procesos acceden el archivo de usuarios conectados.Ej2: Para ver los archivos compartidos, compartir y descompartir archivos se accede al lockfile de cada usuario donde se listan los archivos compartidos por él. Ademas hay un lockfile mas que se utiliza como "bitmap" para marcar cuales archivos han sido "descompartidos"
    \end{itemize}
 
\end{enumerate}

\pagebreak
\section{Diagrama de clases}
\begin{center}
 \includegraphics[width=600pt,height=300pt, angle=90]{./Images/diagrama_de_clases.png}
 % diagrama_de_clases.png: 970x338 pixel, 72dpi, 34.22x11.92 cm, bb=0 0 970 338
\end{center}

\pagebreak
\section{Como usar al aplicaci\'on}
\textbf{Nota:} Se decidi\'o desarrollar una consola para la interacci\'on del usuario. Se utiliz\'o la salida standard para el desarrollo de la misma\\
Se poseen las siguientes opciones:
\begin{itemize}
 \item \textbf{-h,   --help}  Muestra el modo de uso de la aplicaci\'on.
 \item \textbf{-v,   --version}  Muestra la versi\'on de la aplicaci\'on.
 \item \textbf{-f,   --files} Muestra los archivos compartidos por todos los usuarios.
 \item \textbf{-myf, --myfiles}  Muestra los archivos compartidos por por el usuario.
 \item \textbf{-s,   --share   ``path``}  Comparte el archivo indicado por el path.
 \item \textbf{-u,   --unshare nro}  Descomparte el archivo dado por el n\'umero de archivo observado de -myf.
 \item \textbf{-d,   --download nro}  Descarga el archivo dado por el n\'umero de archivo observado de -f.
 \item \textbf{-q,   --quit}  Sale de la aplicaci\'on.
\end{itemize}


%APENDICES
\appendix
\newpage
\section{Enunciado}
\includepdf[pages=1-2]{PrimerProyecto.pdf}

% ------------------------------ Fin del tp -------------------------------

\end{document}

%---------------------------- Fin del documento ---------------------------
